//中断一个线程
//2.直接使用线程内置的标志位：isInterruptued
public class Demo2 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            while(!Thread.currentThread().isInterrupted()){//currentThread返回这个线程对象的引用
                                                           //currentThread是在后续t start之后才执行的，并且是在t线程中执行的，返回的就是指向t线程对象的引用
                System.out.println("hello Thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                    //添加break之后，此时触发异常的时候就会结束循环，让线程结束
                    //在break之前还可以添加一些其他逻辑 doSomething();
                    break;
                    // 使用 IDEA 自动生成 catch 语句, 此时默认给的代码是再次抛出一个其他异常.
                    // 这样的操作太粗暴了, 不只是让 t 线程结束了, 也会使整个进程结束 (没有人 catch 这个 Runtime 异常)
                    // 这只是 IDEA 自动生成的代码, 咱们实际开发, 慎重这么搞.
                    // throw new RuntimeException(e);
                }
            }
        });
        t.start();
        Thread.sleep(2000);
        //在main线程中尝试终止t线程
        t.interrupt();
    }
}

/*
* 在提供的代码中出现 java.lang.InterruptedException: sleep interrupted 警告信息，这并不是错误，而是一个异常堆栈跟踪信息，下面为你详细解释出现该信息的原因和机制。

出现异常的原因
在代码里，t.interrupt() 方法被调用，其作用是中断线程 t。当线程 t 处于 Thread.sleep(1000) 这种阻塞状态时，如果此时被其他线程调用 interrupt() 方法进行中断操作，就会触发 InterruptedException 异常。

异常触发机制详细解释
线程 t 开始运行：t.start() 启动线程 t，线程 t 进入 while 循环，执行打印语句并调用 Thread.sleep(1000) 使线程暂停 1 秒。
主线程休眠：主线程调用 Thread.sleep(2000) 进入休眠状态 2 秒。
中断线程 t：2 秒后，主线程执行 t.interrupt() 方法，尝试中断线程 t。
异常抛出：由于此时线程 t 可能正处于 Thread.sleep(1000) 的阻塞状态，interrupt() 方法会打破这种阻塞，使线程 t 抛出 InterruptedException 异常。
异常捕获与处理：在 catch 块中捕获到 InterruptedException 异常，执行 e.printStackTrace() 打印异常堆栈信息，这就是你看到的警告信息。
解决方案
若不想看到异常堆栈信息的输出，可以选择移除 e.printStackTrace() 语句*/